/**
 * jwt-token验证和解析函数
 */

const jsonwebtoken = require('jsonwebtoken'); // 引入验证jsonwebtoken模块
const { expressjwt: jwt, sign } = require('express-jwt'); // 引入express-jwt模块
const {PRIVATE_KEY} = require('./constant'); // 引入自定义的jwt密钥

// 验证token是否过期
const jwtAuth = jwt({
    // 设置密钥
    secret: PRIVATE_KEY,
    // 设置加密算法，必要的参数，防止潜在的降级攻击。
    algorithms: ["HS256"],
    // 设置为true表示校验，false表示不校验
    credentialsRequired: true,
    // 自定义获取token的函数
    getToken: function fromHeaderOrQuerystring(req) {
        if (
            req.headers.authorization &&
            req.headers.authorization.split(" ")[0] === "Bearer"
        ) {
            return req.headers.authorization.split(" ")[1];
        } else if (req.query && req.query.token) {
            return req.query.token;
        }
        return null;
    },
}).unless({
    // 设置jwt认证白名单，比如/user/login登录接口不需要拦截
    path: [
        '/info',
        '/common/login/do',
        '/user/resetPwd'
    ]
})

/**
 * 生成用户token
 * @param data          <用户存入token的信息>
 * @param expiresIn     <默认24小时过期>
 * @returns {string}
 */
function generateToken(data, expiresIn = 60 * 60 * 24) {
    return jsonwebtoken.sign(data, PRIVATE_KEY, {
        expiresIn
    })
}

module.exports = {
    jwtAuth,
    generateToken,
}
